package com.sz.biz.logistics.core.service;

import com.sz.biz.logistics.core.dto.*;
import com.sz.biz.logistics.core.entity.Quotation;
import com.sz.biz.logistics.core.entity.QuotationSet;
import com.sz.common.base.dto.QueryParams;
import com.sz.common.base.dto.ResultDto;

import java.text.ParseException;
import java.util.Date;
import java.util.List;

/**
 * Function: QuotationService. <br>
 * Date: 2017年03月07日 17:21 <br>
 * Author: wentao.chang
 */
public interface QuotationService {

   /*
     * 一次保存 报价方案的主要数据和详情明细
     * @param quotationDto quotation
     * @return uid
     */
    /*QuotationDto saveMainDetail(QuotationDto quotationDto) throws ParseException;*/

    /**
     * base :名称，编码，费用类型，起运地(起点)，分区，重量段，货币，备注
     *
     * @param quotation quotation
     * @return id
     */
    QuotationDto saveMain(QuotationDto quotation) throws ParseException;

    /**
     * base :名称，编码，费用类型，起运地(起点)，分区，重量段，货币，备注
     *
     * @param uid          uid
     * @param isFromAudit  isFromAudit
     * @param quotationDto quotation
     */
    QuotationDto updateMain(String uid, QuotationDto quotationDto, boolean isFromAudit) throws ParseException;

    /**
     * base :明细
     * sheet:生效时间 失效时间 表格数据
     *
     * @param uid         uid
     * @param setDto      setDto
     * @param isFromAudit isFromAudit
     * @return uid
     */
    QuotationSet saveDetail(String uid, QuotationSetDto setDto, boolean isFromAudit) throws ParseException;

    /**
     * 上线
     */
    void online(List<String> uids, boolean isConfirmed) throws ParseException;

    /**
     * 下线
     */
    void offline(List<String> uids) throws ParseException;

    /**
     * 打回
     */
    void reject(List<String> uids, String msg) throws ParseException;

    /**
     * 提交
     */
    void submit(List<String> uids);

    /**
     * 审核
     */
    void audit(List<String> uids, String msg) throws ParseException;

    /**
     * 删除
     */
    void delete(List<String> uids);

    /*
     * 按Id删除
     *
     * @param id id
     */
    /*void realDeleteById(int id);*/

    /**
     * 获取uid生效的报价方案主要信息
     *
     * @param uid uid
     */
    QuotationDto findActivedByUid(String uid);

    /**
     * 获取uids生效的报价方案主要信息
     *
     * @param uids uids
     */
    List<Quotation> findActivedByUids(List<String> uids);


    /**
     * 根据uid查询可用生效的实体
     *
     * @param uid  uid
     * @param time 时间点
     * @return 查询出来的实体对象
     */
    QuotationDto findByUidAndTime(String uid, Date time);

    /**
     * 根据bizuid查询可用生效的实体
     *
     * @param bizuid bizuid
     * @param time   时间点
     * @return 查询出来的实体对象
     */
    List<Quotation> findByBizUidAndTime(String bizuid, Date time);

    /**
     * 定位报价方案上所有的报价方案
     */
    List<Quotation> findByBizUid(String bizUid);

    /**
     * 定位报价方案时间轴上所有在线的报价方案
     */
    List<Quotation> findByBizUidAndTimeline(Quotation quotation);

    /**
     * 过滤报价方案
     */
    ResultDto findByFilter(QueryParams params);


    /**
     * 按报价方案id查询
     */
    Quotation findById(int id);

    /**
     * 按报价方案setid查询报价明细
     */
    QuotationSetDto findQuotationSetBySetId(String quotationUid, int setId);

    /**
     * 按报价方案ids查询
     */
    List<Quotation> findByIds(List<Integer> quotationIds);

    /**
     * 根据产品的UID查询价格等级的列表
     *
     * @param productUid productUid
     * @return
     */
    List<QuotationGradeDto> findQuotationGrades(String productUid);

    /**
     * 查询所有已经上线但是起点为空的报价
     *
     * @param type 1采购价 2销售价
     */
    List<Quotation> findNoneStartOnlineQuotations(int type, Date time);


    /**
     * 根据分区方案的uid或重量段的uid查询价格方案表，获取是否有引用
     *
     * @param uid  分区的方案uid
     * @param isOnline  是否在线
     * @return true 有引用，false无引用
     */
    boolean isRegionSchemaReferenced(String uid, boolean isOnline);

    /**
     * 根据重量段的uid查询价格方案表，获取是否有引用
     * @param uid       重量段的方案uid
     * @param isOnline  是否在线
     * @return  true 有引用，false无引用
     */
    boolean isWeightSchemaReferenced(String uid, boolean isOnline);

    /**
     * 根据销售报价的uid以及服务uid查询此服务的成本价的分区
     *
     * @param quotationUid 报价uid
     * @param serviceUid  服务uid
     * @return QuotationRegionDto 返回的成本的分区信息
     */
    QuotationRegionDto findQuotationRegion(String quotationUid, String serviceUid);

    /**
     * 复制明细
     * @param uid uid
     * @param dto dto
     */
    QuotationDto copyDetail(String uid, QuotationDetailCopyDto dto);
    /*
     * 定位报价方案时间点上单条报价方案
     */
    /*List<Quotation> findByLocationCondation(
            int type*//*报价类型1.成本价2.销售价*//*,
            String cargoTypeCode*//*货物类型*//*,
            int settleMentTypeId*//*结算方式*//*,
            String starts*//*起点？？？*//*,
            String feeTypeId*//*报价类型运费 附加费 杂费*//*,
            int grade*//*价格等级*//*
    );*/
}

